from abc import ABCMeta, abstractclassmethod

'''
多态:继承，重写，父类引用指向子类对象
'''


class Pet(object, metaclass=ABCMeta):
    '''宠物

    这是个抽象类
    '''

    def __init__(self, nickname):
        self._nickname = nickname

    @abstractclassmethod
    def make_voice(cls, self):
        # 抽象类
        '''发出声音
        抽象方法
        '''

        pass


class Dog(Pet):
    '''狗'''

    def make_voice(self):
        '''重写
        类似于java中的Override
        '''
        print('%s : 汪汪汪。。。' % self._nickname)


class Cat(Pet):
    '''猫'''

    def make_voice(self):
        print('%s : 喵喵喵喵。。。。' % self._nickname)


def main():
    pers = [Dog('旺财'), Cat('凯迪'), Dog('大皇')]
    for i in pers:
        i.make_voice()


if __name__ == "__main__":
    main()
